package com.nercl.dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.nercl.dao.BaseDao;
import com.nercl.util.HibernateSessionFactory;

public class BaseDaoImpl<T> implements BaseDao<T>{

	private Class<T> clazz;
		
	/** 
     * 通过构造方法指定DAO的具体实现类 
     */  
    @SuppressWarnings("unchecked")
	public BaseDaoImpl() {  
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();  
        clazz = (Class<T>) type.getActualTypeArguments()[0];  
    }
    /** 
     * 获取当前工作的Session 
     */  
    protected Session getSession() {  
        return HibernateSessionFactory.getSession();  
    }   
	
	@Override
	public void save(T entity) {
		// TODO Auto-generated method stub
		System.out.println("执行保存方法 start!!");
		//this.getSession.save(entity); 
		//直接使用这个会出现一种情况，保存后数据库没有数据。
		//但是使用数据库管理工具添加数据，本来是没有记录的，插入数据之后ID竟然不是从一开始的
		//出现这种的现象的原因是事务没有开启。
		//hibernate成功执行sava且不报错后，数据库中没有数据的原因：hibernate 必须显示的声明提交事务
		Session session = this.getSession();
		session.beginTransaction();
		session.save(entity);
		session.beginTransaction().commit();
		System.out.println("执行保存方法 end!!");
	}

	@Override
	public void update(T entity) {
		// TODO Auto-generated method stub
		//参考save方法修改
		this.getSession().update(entity);
	}

	@Override
	public void delete(Serializable id) {
		// TODO Auto-generated method stub
		Session session = this.getSession();
		session.beginTransaction();
		session.delete(this.findById(id));
		session.beginTransaction().commit();
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findById(Serializable id) {
		// TODO Auto-generated method stub
		Session session = this.getSession();
		session.beginTransaction();
		return (T)session.get(this.clazz, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> findByHQL(String hql, Object... params) {
		// TODO Auto-generated method stub
		Query query = this.getSession().createQuery(hql);  
        for (int i = 0; params != null && i < params.length; i++) {  
            query.setParameter(i, params);  
        }  
        return query.list();  
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findAll(String hql) {
		// TODO Auto-generated method stub
		Session session = this.getSession();
		session.beginTransaction();
		Query query = session.createQuery(hql);  
		return query.list();
	}

}
